package com.example.TreeView;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;

import java.util.List;

public abstract class PuDeviceTreeListViewAdapter<T> extends BaseAdapter {
	protected Context mContext;
	/**
	 * 存储所有可见的Node
	 */
	protected List<PuDeviceNode> mNodes;
	protected LayoutInflater mInflater;
	/**
	 * 存储所有的Node
	 */
	protected List<PuDeviceNode> mAllNodes;

	/**
	 * 点击的回调接口
	 */
	private OnTreeNodeClickListener onTreeNodeClickListener;

	public interface OnTreeNodeClickListener {
		void onClick(PuDeviceNode node, int position);
		void onLongClick(PuDeviceNode node, View view, int position);
	}

	public void setOnTreeNodeClickListener(
			OnTreeNodeClickListener onTreeNodeClickListener) {
		this.onTreeNodeClickListener = onTreeNodeClickListener;
	}

	/**
	 * @param mTree
	 * @param context
	 * @param datas
	 * @param defaultExpandLevel 默认展开几级树
	 */
	public PuDeviceTreeListViewAdapter(ListView mTree, Context context, List<PuDeviceBean> datas,
											int defaultExpandLevel) throws IllegalArgumentException,
			IllegalAccessException {
		mContext = context;
		/**
		 * 对所有的Node进行排序
		 */
		mAllNodes = TreeHelper.getSortedNodes(datas, defaultExpandLevel);
		/**
		 * 过滤出可见的Node
		 */
		mNodes = TreeHelper.filterVisibleNode(mAllNodes);
		mInflater = LayoutInflater.from(context);

		/**
		 * 设置节点点击时，可以展开以及关闭；并且将ItemClick事件继续往外公布
		 */
		mTree.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
									int position, long id) {
				expandOrCollapse(position);

				if (onTreeNodeClickListener != null) {
					onTreeNodeClickListener.onClick(mNodes.get(position),
							position);
				}
			}

		});
		mTree.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
				if (onTreeNodeClickListener != null) {
					onTreeNodeClickListener.onLongClick(mNodes.get(position), view, position);
					return true;
				}
				return false;
			}
		});

	}

	/**
	 * 相应ListView的点击事件 展开或关闭某节点
	 *
	 * @param position
	 */
	public void expandOrCollapse(int position) {
		PuDeviceNode n = mNodes.get(position);

		if (n != null)// 排除传入参数错误异常
		{
			if (!n.isLeaf()) {
				n.setExpand(!n.isExpand());
				mNodes = TreeHelper.filterVisibleNode(mAllNodes);
				notifyDataSetChanged();// 刷新视图
			}
		}
	}

	@Override
	public int getCount() {
		return mNodes.size();
	}

	@Override
	public Object getItem(int position) {
		return mNodes.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		PuDeviceNode node = mNodes.get(position);
		convertView = getConvertView(node, position, convertView, parent);
		// 设置内边距
		convertView.setPadding(node.getLevel() * 30, 3, 3, 3);
		return convertView;
	}

	public abstract View getConvertView(PuDeviceNode node, int position,
										View convertView, ViewGroup parent);

	public void refreshUI(List<PuDeviceBean> datas) throws IllegalAccessException {
		mAllNodes = TreeHelper.getSortedNodes(datas, 1);
		mNodes = TreeHelper.filterVisibleNode(mAllNodes);
	}
}
